package app

import (
	"container/list"
)

// 聊天室事件定义
type Event struct {
	Type      string `json:"type"`      // 事件类型
	User      string `json:"user"`      // 用户名
	Timestamp int64  `json:"timestamp"` // 时间戳
	Text      string `json:"text"`      // 事件内容
	UserCount int    `json:"userCount"` // 房间用户数
}

// 用户订阅
type Subscription struct {
	Id       string       // 用户在聊天室中的ID
	Username string       // 用户名
	Pipe     <-chan Event // 事件接收通道 用户从这个通道接收消息
	EmitCHn  chan Event   // 用户消息推送通道
	LeaveChn chan int     // 用户离开事件推送
}

type Room struct {
	users       map[int]chan Event     // 当前房间订阅者
	userCount   int                    // 当前房间总人数
	publishChn  chan Event             // 聊天室的消息推送入口
	archive     *list.List             // 历史记录 todo 未持久化 重启失效
	archiveChan chan chan []Event      // 通过接受chan来同步聊天内容
	joinChn     chan chan Subscription // 接收订阅事件的通道 用户加入聊天室后要把历史事件推送给用户
	leaveChn    chan int               // 用户取消订阅通道 把通道中的历史事件释放并把用户从聊天室用户列表中删除
}
